/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package networkservice;

import gfdclient.InnerLogic;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.RemoteException;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.Timer;
import messagemanager.JMessage;
import userservercontroller.INetworking;
import userservercontroller.IUserServerController;

/**
 * Сервис, который организует пинг сервера, чтобы оповестить его о том, что
 * он в сети
 * @author Volk ID = 1001
 * @author Alex-Rude ID = 2001
 */
public class PingNetService {
  //---------------------Атрибуты клсса-------------------------------
  private int delay = 10000; //Интервал между пингами
  private Timer timer=null; // Таймер
  private InnerLogic logic; //Ccылка на сетевые команды сервера
  /** объект, реагирующий на разрыв соединения */
  private ReconnectPingService reconnectPingService;
  //-------------------------------------------------------------------


  /** Класс-обработчик событий таймера */
    class PingListener implements ActionListener{
        public void actionPerformed(ActionEvent e) {
            INetworking network = logic.getUSC();
            if(network == null) return; //Клиент не авторизован
            try{
                //System.out.println("DEBUG: ping ");
                switch((int)network.pingLastOperationStatus(
                        logic.getAutorizationKey())){
                //Авторизован сообщений нет - выходим
                case 0:
                    return;
                //Авторизован есть сообщений
                case 1:
                    //Тут должен быть код получения сообщений
                    IUserServerController usc = logic.getUSC();
                    LinkedList<JMessage> list = usc.getMessageList(logic.getAutorizationKey());
                    Iterator<JMessage> iter = list.iterator();
                    while(iter.hasNext()){
                     JMessage message = iter.next();
                     String result = "Сообщение от сервера: " + message.getTime().toString() + " : " + message.getText();
                     logic.getMainFrame().msg(result);
                    }

                    //---------------------------------------
                    break;
                case -1:
                    //Не авторизован-------------------------
                    //Перед началом работы пользователя необходимо авторизовать
                    //кроме того сервер может переконфигурировать собственные настройки
                    //в связи с чем принудительно отключить всех клиентов авторизованных
                    //в момент реконфигурации
                    logic.killConnection();
                    logic.printMsg("Сервер вызвал принудительное отключение всех клиентов");
                    break;
                }
            }catch(RemoteException re){//Обработка потери соединения при пинге
                reconnectPingService.doReaction();
            }
        }
    }


  //---------------------Сервисные методы-----------------------------
    private void initTimer(){
        ActionListener listener = new PingListener();
        if(timer != null) timer.stop();
        timer = new Timer(delay, listener);
    }
  //------------------------------------------------------------------

  //--------------------Пользовательские методы-----------------------
  /**
   * Конструктор класса
   * @param logic - ссылка на внутреннюю логину работы программы
   */
  public PingNetService(InnerLogic logic){
   if(logic == null) throw new NullPointerException();
   this.logic = logic;
   reconnectPingService = new ReconnectPingService(logic);
   //initTimer();
  }

  /**
   * Полчить интервал пинга
   * @return интервал пинга
   */
  public int getDelay(){
   return delay;
  }

  /**
   * Установит интервал пинга
   * @param delay - новый интервал пинга
   */
  public void setDelay(int delay){
   this.delay = delay;
   initTimer();
  }

  
  /**
   * Начало пинга
   */
    public void startPing(){
        System.out.println("DEBUG: start ping");
        initTimer();
        timer.start();
    }

   /**
    * Приостановить пинг
    */
    public void stopPing(){
        if(timer!=null) {
            timer.stop();
            System.out.println("DEBUG: stop ping");
        }
    }

  //------------------------------------------------------------------

}
